package RMI;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;

import DTO.DTO_Tarea;
import Interface_TDA.TDAManejoDeDatos;
import Negocio.CompraInsumo;
import Negocio.DepositoCentral;
import Negocio.InformeReposicion;
import Negocio.InformeReposicionArea;
import Negocio.Ingrediente;
import Negocio.Insumo;
import Negocio.InsumoAReponer;
import Negocio.Local;
import Negocio.PedidoInsumo;
import Negocio.PlanProdSemiElab;
import Negocio.Tarea;



public class AdministracionCentral extends UnicastRemoteObject implements TDAManejoDeDatos{

	private static AdministracionCentral instance = null;
	private List<Local> locales;
	private PlanProdSemiElab planProduccion;
	private List<InformeReposicion> informesReposicion;
	private DepositoCentral depositoCentral;

	public AdministracionCentral() throws RemoteException {
		super();
		//locales = DAO_Local.getLocales();
		// planProduccion = DAO_PlanProdSemiElab.getPlanProd();
//		depositoCentral = DAO_Deposito.getDepositoCentral();
		informesReposicion = new ArrayList<InformeReposicion>();
	}

	public static AdministracionCentral getInstance() {
		if (instance == null)
			try {
				instance = new AdministracionCentral();
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		return instance;
	}

	public boolean controlarPlanProduccion() {

		List<Tarea> tareasAux = new ArrayList<Tarea>();
		float total = 0, ejecutadas = 0, totalHoras = 0;
		for (Tarea tarea : planProduccion.getTareas()) {
			total++;
			if (tarea.getEstado().equals("Ejecutada")) {
				ejecutadas++;
			}
		}
		if ((ejecutadas / total) > 0.6)
			return true;
		return false;

	}

	public void generarPlanProduccion(List<DTO_Tarea> auxTareas) {

		planProduccion= new PlanProdSemiElab();
		List<Tarea> tars = new ArrayList<Tarea>();
		for (DTO_Tarea tar : auxTareas)
			tars.add(new Tarea(tar));
		planProduccion.setTareas(tars);

		for (Tarea tar : tars) {
			/*
			 * MIentras hayan tareas por agregar, nos fijaremos si hay horas
			 * disponibles en la cocina de los locales, si disponen de tiempo.
			 */
			if ((locales.get(0).getCocina().getHorasPreparacion() - tar
					.getHoras()) >= 0) {
				tar.setLocal(locales.get(0));
				tar.setEstado("Asignado");
				locales.get(0).getCocina().addTarea(tar);
				for (Ingrediente ing : tar.getItem().getReceta()
						.getIngredientes()) {
					locales.get(0)
							.getCocina()
							.getInformeReposicionArea()
							.agregarInsumoAReponer(
									new InsumoAReponer(ing.getInsumo(), ing
											.getCantidad()));
				}

			} else if ((locales.get(1).getCocina().getHorasPreparacion() - tar
					.getHoras()) >= 0) {
				tar.setLocal(locales.get(1));
				tar.setEstado("Asignado");
				locales.get(1).getCocina().addTarea(tar);
				for (Ingrediente ing : tar.getItem().getReceta()
						.getIngredientes()) {
					locales.get(1)
							.getCocina()
							.getInformeReposicionArea()
							.agregarInsumoAReponer(
									new InsumoAReponer(ing.getInsumo(), ing
											.getCantidad()));
				}
			} else if ((locales.get(2).getCocina().getHorasPreparacion() - tar
					.getHoras()) >= 0) {
				tar.setLocal(locales.get(2));
				tar.setEstado("Asignado");
				locales.get(2).getCocina().addTarea(tar);
				for (Ingrediente ing : tar.getItem().getReceta()
						.getIngredientes()) {
					locales.get(2)
							.getCocina()
							.getInformeReposicionArea()
							.agregarInsumoAReponer(
									new InsumoAReponer(ing.getInsumo(), ing
											.getCantidad()));
				}

			} else {
				tar.setEstado("Pendiente");
			}

		}
		planProduccion.setTareas(tars);

	}
	public List<InformeReposicion> obtenerReporte()
	{
		for(Local loco: locales)
			informesReposicion.add(loco.obtenerInformeReposicion());
		return informesReposicion;
	
	}
	public List<CompraInsumo> CompraInsumos()
	{
		List<CompraInsumo> compraInsumos = new ArrayList<CompraInsumo>();
		List<InformeReposicion> informes= this.obtenerReporte();
		//Lo comento porque sino tira error el admin
//		for(InformeReposicion infRep: informes)
//			for(InformeReposicionArea infRepArea:infRep.getInformesRepAreas())
//				for(InsumoAReponer insumoAReponer:infRepArea.getInsumosAReponer())
//					if(insumoAReponer.getCantidad()>DAO_DepositoCentral.getStockInsumo().getCantidad())
//						compraInsumos.add(new CompraInsumo(insumoAReponer.getInsumo(),insumoAReponer.getCantidad()-DAO_DepositoCentral.getStockInsumo().getCantidad()));
		return compraInsumos;
	}
	
}